package ecg.encrypt;

import java.security.Key;
import javax.crypto.Cipher;
import ecg.encrypt.KeyGen;
import ecg.util.ByteUtils;

public class Encrypt
{
	public static String encryption(String data, String keyData) throws Exception
	{  
		byte[] dataBytes;
		
		// 패스워드 암호화의 경우 패스워드 자체가 키가 되기때문에 따로 키 데이터를 null로 넘긴다.
		if(keyData == null)
		{
			dataBytes = data.getBytes();  
		}
		else
		{
			dataBytes = keyData.getBytes();  
		}

		int len = dataBytes.length;  
	
		byte[] keyBytes = new byte[16];  
	
		if (len >= 16)
		{  
			System.arraycopy(dataBytes, 0, keyBytes, 0, 16);  
	
		} 
		else
		{  
		    System.arraycopy(dataBytes, 0, keyBytes, 0, len);  
	
		    for (int i = 0; i < (16 - len); i++) 
		    {  
		       keyBytes[len + i] = dataBytes[i % len];  
		    }  
	
		}  

		  
	  // 전달받은 데이터를 이용하여 키 생성.
	  Key key = KeyGen.generateKey("AES", keyBytes);  

	  String transformation = "AES/ECB/PKCS5Padding";  

	  Cipher cipher = Cipher.getInstance(transformation);  

	  
	  // 1. 키를 이용한 데이터 암호화.
	  cipher.init(Cipher.ENCRYPT_MODE, key);  

	
	  byte[] plain = data.getBytes(); 
	  
		  
	  // 2. 키를 이용한 데이터 암호화.
	  byte[] encrypt = cipher.doFinal(plain);  
	  
	  
	  // 3. 암호화 된 데이터.
	  String encryptedData = ByteUtils.toHexString(encrypt);

	 //System.out.println("원문 : " + ByteUtils.toHexString(plain));  

	 //System.out.println("암호 : " + encryptedData);  

	  
	  
	  /*
	   * 암호화된 데이터 복호화 순서.
	   * 1. 16진수 문자열로 변환한 암호화된 데이터를 바이트 배열로 바꾼다음
	   * 2. 아래 절차 진행.
	   */
	  
	  // 1. 암호화 된 데이터 복호화.
	 // cipher.init(Cipher.DECRYPT_MODE, key);  

	  // 2. 암호화 된 데이터 복호화.
	  //byte[] decrypt = cipher.doFinal(encrypt);  

	  //System.out.println("복호 : " + ByteUtils.toHexString(decrypt));  
	  //System.out.println("복호화된 바이트 배열 ==> 문자열: " + new String(decrypt));
	  
	  return encryptedData;

	} 
}
